{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "import pandas as pd\n",
    "from oemof import solph\n",
    "\n",
    "from oemof.solph.plumbing import sequence\n",
    "import datetime as dt\n",
    "\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# function for summarize information about flows\n",
    "def calc_total_flows(storage_flow, boiler_flow, total_flow, demand, schedule=None):\n",
    "    total_flows = pd.DataFrame(data={\"storage_flow\": storage_flow[storage_flow.columns[0]],\n",
    "                                    \"boiler_flow\": boiler_flow[boiler_flow.columns[0]]})\n",
    "    if schedule:\n",
    "        total_flows['schedule'] = schedule\n",
    "    total_flows['total_heat_flow'] = total_flow[total_flow.columns[0]]\n",
    "    total_flows['demand'] = demand[\"demand\"]\n",
    "    return total_flows\n",
    "\n",
    "# function for preparing area plots\n",
    "def prep_area_plot(df):\n",
    "    stor_boil_flow = df.drop(columns=[\"total_heat_flow\", \"demand\"])\n",
    "    stor_boil_flow = stor_boil_flow.asfreq(freq=\"0.1min\", method=\"backfill\")\n",
    "    columns = list(stor_boil_flow.columns)\n",
    "    columns.insert(2, columns[0])\n",
    "    columns.remove(columns[0])\n",
    "    stor_boil_flow = stor_boil_flow.reindex(columns = columns)\n",
    "    return stor_boil_flow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "filename = 'test_schedule_flow.csv'\n",
    "full_filename = os.path.join(os.getcwd(), filename)\n",
    "data = pd.read_csv(full_filename, sep=\",\")\n",
    "timeindex = pd.date_range('1/1/2017', periods=8, freq='H')\n",
    "periods = len(timeindex)\n",
    "energysystem = solph.EnergySystem(timeindex=timeindex)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "b_gas = solph.Bus(label = \"natural_gas\")\n",
    "source_gas = solph.Source(label=\"source_gas\",\n",
    "                          outputs={b_gas: solph.Flow()})\n",
    "\n",
    "energysystem.add(b_gas, source_gas)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Adding components\n",
    "\n",
    "Three boilers with their own demands, source, busses and storages will be added.\n",
    "\n",
    "The three systems are not interfering with each other.\n",
    "\n",
    "The following energy system is modeled:\n",
    "\n",
    "![alt text](schedule_es_example.png \"Energysystem example with schedule\")\n",
    "\n",
    "## Add regular components\n",
    "- Source\n",
    "- Demand\n",
    "- Transformer\n",
    "- GenericStorage\n",
    "- Bus\n",
    "\n",
    "without any restrictions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "b_th_regular = solph.Bus(label = \"heat_regular\")\n",
    "\n",
    "source_th_regular = solph.Source(label='source_th_regular',\n",
    "                         outputs={b_th_regular: solph.Flow(variable_costs=10000)})\n",
    "\n",
    "demand_th_regular = solph.Sink(label='demand_th_regular', inputs={b_th_regular: solph.Flow(\n",
    "                       fix=data['demand_th'], nominal_value=200)})\n",
    "\n",
    "boiler_regular = solph.Transformer(\n",
    "    label=\"boiler_regular\",\n",
    "    inputs={b_gas: solph.Flow()},\n",
    "    outputs={b_th_regular: solph.Flow(nominal_value=200, variable_costs=1)},\n",
    "    conversion_factors={b_th_regular: 1}\n",
    ")\n",
    "\n",
    "storage_th_regular = solph.components.GenericStorage(\n",
    "    label='storage_th_regular',\n",
    "    inputs={b_th_regular: solph.Flow()},\n",
    "    outputs={b_th_regular: solph.Flow()},\n",
    "    initial_storage_level=1,\n",
    "    balanced=False,\n",
    "    nominal_storage_capacity=1000)\n",
    "\n",
    "energysystem.add(b_th_regular, source_th_regular, demand_th_regular, boiler_regular, storage_th_regular)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Add schedule components\n",
    "- Source\n",
    "- Demand\n",
    "- Transformer\n",
    "- GenericStorage\n",
    "- Bus\n",
    "\n",
    "with a schedule for the boiler (Transformer) flow."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "b_th_schedule = solph.Bus(label = \"heat_schedule\")\n",
    "\n",
    "source_th_schedule = solph.Source(label='source_th_schedule',\n",
    "                         outputs={b_th_schedule: solph.Flow(variable_costs=10000)})\n",
    "\n",
    "demand_th_schedule = solph.Sink(label='demand_th_schedule', inputs={b_th_schedule: solph.Flow(\n",
    "                       fix=data['demand_th'], nominal_value=200)})\n",
    "\n",
    "schedule = [300,30,10,300,120,120,50,10]\n",
    "schedule_df = pd.DataFrame(index = timeindex, data={\"schedule\": schedule})\n",
    "\n",
    "boiler_schedule = solph.Transformer(\n",
    "    label=\"boiler_schedule\",\n",
    "    inputs={b_gas: solph.Flow()},\n",
    "    outputs={b_th_schedule: solph.Flow(nominal_value=200, variable_costs=0,\n",
    "                                      schedule_cost_pos = [999,999,999,999,999,999,999,999],\n",
    "                                      schedule_cost_neg = [999,999,999,999,999,999,999,999],\n",
    "                                      schedule=schedule)},\n",
    "    conversion_factors={b_th_schedule: 1}\n",
    ")\n",
    "\n",
    "storage_th_schedule = solph.components.GenericStorage(\n",
    "    label='storage_th_schedule',\n",
    "    inputs={b_th_schedule: solph.Flow()},\n",
    "    outputs={b_th_schedule: solph.Flow()},\n",
    "    initial_storage_level=0.5,\n",
    "    balanced=False,\n",
    "    nominal_storage_capacity=2000)\n",
    "\n",
    "energysystem.add(b_th_schedule, source_th_schedule, demand_th_schedule, boiler_schedule, storage_th_schedule)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Add flexible components\n",
    "- Source\n",
    "- Demand\n",
    "- Transformer\n",
    "- GenericStorage\n",
    "- Bus\n",
    "\n",
    "with a schedule for a few timesteps (not all!) for the flow of the boiler (Transformer)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "b_th_flex = solph.Bus(label = \"heat_flex\")\n",
    "\n",
    "source_th_flex = solph.Source(label='source_th_flex',\n",
    "                         outputs={b_th_flex: solph.Flow(variable_costs=10000)})\n",
    "\n",
    "demand_th_flex = solph.Sink(label='demand_th_flex', inputs={b_th_flex: solph.Flow(\n",
    "                       fix=data['demand_th'], nominal_value=200)})\n",
    "\n",
    "schedule_flex = [None,20,None,None,100,30,10,100]\n",
    "schedule_flex_df = pd.DataFrame(index = timeindex, data={\"schedule\": schedule_flex})\n",
    "\n",
    "boiler_flex = solph.Transformer(\n",
    "    label=\"boiler_flex\",\n",
    "    inputs={b_gas: solph.Flow()},\n",
    "    outputs={b_th_flex: solph.Flow(nominal_value=200, variable_costs=1,\n",
    "                                   schedule_cost_pos = 999,\n",
    "                                   schedule_cost_neg = 999,\n",
    "                                   schedule=schedule_flex)},\n",
    "    conversion_factors={b_th_flex: 1}\n",
    ")\n",
    "\n",
    "storage_th_flex = solph.components.GenericStorage(\n",
    "    label='storage_th_flex',\n",
    "    inputs={b_th_flex: solph.Flow()},\n",
    "    outputs={b_th_flex: solph.Flow()},\n",
    "    initial_storage_level=1,\n",
    "    balanced=False,\n",
    "    nominal_storage_capacity=1000)\n",
    "\n",
    "energysystem.add(b_th_flex, source_th_flex, demand_th_flex, boiler_flex, storage_th_flex)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Welcome to the CBC MILP Solver \n",
      "Version: 2.9.9 \n",
      "Build Date: Aug 21 2017 \n",
      "\n",
      "command line - /usr/bin/cbc -printingOptions all -import /tmp/tmprhtbglid.pyomo.lp -stat=1 -solve -solu /tmp/tmprhtbglid.pyomo.soln (default strategy 1)\n",
      "Option for printingOptions changed from normal to all\n",
      "Presolve 44 (-37) rows, 101 (-52) columns and 164 (-106) elements\n",
      "Statistics for presolved model\n",
      "\n",
      "\n",
      "Problem has 44 rows, 101 columns (38 with objective) and 164 elements\n",
      "There are 38 singletons with objective \n",
      "Column breakdown:\n",
      "66 of type 0.0->inf, 35 of type 0.0->up, 0 of type lo->inf, \n",
      "0 of type lo->up, 0 of type free, 0 of type fixed, \n",
      "0 of type -inf->0.0, 0 of type -inf->up, 0 of type 0.0->1.0 \n",
      "Row breakdown:\n",
      "16 of type E 0.0, 0 of type E 1.0, 0 of type E -1.0, \n",
      "17 of type E other, 0 of type G 0.0, 0 of type G 1.0, \n",
      "0 of type G other, 0 of type L 0.0, 0 of type L 1.0, \n",
      "0 of type L other, 0 of type Range 0.0->1.0, 11 of type Range other, \n",
      "0 of type Free \n",
      "Presolve 44 (-37) rows, 101 (-52) columns and 164 (-106) elements\n",
      "Perturbing problem by 0.001 %% of 10000 - largest nonzero change 0.0010151927 (%% 0.0099324267) - largest zero change 0.0010075672\n",
      "0  Obj 0 Primal inf 4450.4 (17)\n",
      "41  Obj 161.54122 Primal inf 44.799996 (4)\n",
      "43  Obj 161.55799\n",
      "Optimal - objective value 154.4\n",
      "After Postsolve, objective 154.4, infeasibilities - dual 0 (0), primal 0 (0)\n",
      "Optimal objective 154.4 - 43 iterations time 0.002, Presolve 0.00\n",
      "Total time (CPU seconds):       0.00   (Wallclock seconds):       0.00\n",
      "\n"
     ]
    }
   ],
   "source": [
    "om = solph.Model(energysystem)\n",
    "\n",
    "om.solve(solver='cbc', solve_kwargs={'tee': True})\n",
    "results = solph.processing.results(om)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Show results\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "# boiler heat flow\n",
    "res_boiler_regular = results[(boiler_regular, b_th_regular)][\"sequences\"]\n",
    "res_boiler_schedule = results[(boiler_schedule, b_th_schedule)][\"sequences\"]\n",
    "res_boiler_flex = results[(boiler_flex, b_th_flex)][\"sequences\"]\n",
    "\n",
    "# storage heat flows\n",
    "stor2h_reg = results[(storage_th_regular, b_th_regular)][\"sequences\"]\n",
    "stor2h_sched = results[(storage_th_schedule, b_th_schedule)][\"sequences\"]\n",
    "stor2h_flex = results[(storage_th_flex, b_th_flex)][\"sequences\"]\n",
    "\n",
    "# demand\n",
    "demand_list = list((data[\"demand_th\"])*200)\n",
    "demand = pd.DataFrame(data = {\"demand\": demand_list})\n",
    "demand.index = res_boiler_regular.index\n",
    "\n",
    "# actual flow to demand\n",
    "th2demand_reg = results[(b_th_regular, demand_th_regular)][\"sequences\"]\n",
    "th2demand_sched = results[(b_th_schedule, demand_th_schedule)][\"sequences\"]\n",
    "th2demand_flex = results[(b_th_flex, demand_th_flex)][\"sequences\"]\n",
    "\n",
    "# summarize heat flows from boiler and storage compared to demand\n",
    "tot_flow_reg = calc_total_flows(stor2h_reg, res_boiler_regular, th2demand_reg, demand)\n",
    "tot_flow_sched = calc_total_flows(stor2h_sched, res_boiler_schedule, th2demand_sched, demand, schedule)\n",
    "tot_flow_flex = calc_total_flows(stor2h_flex, res_boiler_flex, th2demand_flex, demand, schedule_flex)\n",
    "\n",
    "# put all boiler activities in one df\n",
    "all_activities = pd.DataFrame(data={\"reg_boiler\": res_boiler_regular[\"flow\"],\n",
    "                                    \"sched_boiler\": res_boiler_schedule[\"flow\"],\n",
    "                                   \"flex_boiler\": res_boiler_flex[\"flow\"]})\n",
    "\n",
    "\n",
    "# storage capacities\n",
    "res_stor_reg = results[(storage_th_regular, None)][\"sequences\"]\n",
    "res_stor_sched = results[(storage_th_schedule, None)][\"sequences\"]\n",
    "res_stor_flex = results[(storage_th_flex, None)][\"sequences\"]\n",
    "\n",
    "# storage heat flows\n",
    "stor2h_flex = results[(storage_th_flex, b_th_flex)][\"sequences\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## View boiler activities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>reg_boiler</th>\n",
       "      <th>sched_boiler</th>\n",
       "      <th>flex_boiler</th>\n",
       "      <th>schedule_flex</th>\n",
       "      <th>schedule</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2017-01-01 00:00:00</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 01:00:00</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 02:00:00</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 03:00:00</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 04:00:00</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>120</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 05:00:00</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>30.0</td>\n",
       "      <td>120</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 06:00:00</th>\n",
       "      <td>11.2</td>\n",
       "      <td>94.0</td>\n",
       "      <td>11.2</td>\n",
       "      <td>10.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 07:00:00</th>\n",
       "      <td>66.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     reg_boiler  sched_boiler  flex_boiler  schedule_flex  \\\n",
       "2017-01-01 00:00:00         0.0           0.0          0.0            NaN   \n",
       "2017-01-01 01:00:00         0.0           0.0          0.0           20.0   \n",
       "2017-01-01 02:00:00         0.0           0.0          0.0            NaN   \n",
       "2017-01-01 03:00:00         0.0           0.0          0.0            NaN   \n",
       "2017-01-01 04:00:00         0.0           0.0          0.0          100.0   \n",
       "2017-01-01 05:00:00         0.0           0.0          0.0           30.0   \n",
       "2017-01-01 06:00:00        11.2          94.0         11.2           10.0   \n",
       "2017-01-01 07:00:00        66.0          66.0         66.0          100.0   \n",
       "\n",
       "                     schedule  \n",
       "2017-01-01 00:00:00       300  \n",
       "2017-01-01 01:00:00        30  \n",
       "2017-01-01 02:00:00        10  \n",
       "2017-01-01 03:00:00       300  \n",
       "2017-01-01 04:00:00       120  \n",
       "2017-01-01 05:00:00       120  \n",
       "2017-01-01 06:00:00        50  \n",
       "2017-01-01 07:00:00        10  "
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ax = all_activities.plot(kind='line', drawstyle='steps-pre', grid=True)\n",
    "ax.set_xlabel('Time (h)')\n",
    "ax.set_ylabel('Q (kW)')\n",
    "plt.show()\n",
    "all_activities[\"schedule_flex\"]=schedule_flex\n",
    "all_activities[\"schedule\"]=schedule\n",
    "all_activities"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## View storage capacities compared to demand and boiler activity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "#### REGULAR HEAT FLOWS COMPARED TO DEMAND (AREA PLOT) ####\n",
      "\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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+HtZSiYiEXv66aejDkEkYermkhpRi0r2Vxa+911NkzKUTEREakLfp8pQMhERkYQpmURM3UUiGUZ/s3FpAF7S3q7Tz4AkrA9SqmVLGs54vdrVHn/8cYYOHZp2S9mOHDmSGTNmcPrpp9O4cWMOPPBArrjiiqjD2g8oqcRSy0TSXzITSQLHGz9+PN9//3216hQXF9fouarjmWeeYdasWYwcOTLlzyVSHiUTkTi+++47fvKTn9CnTx969erF7373O9auXct5553HueeeCwTzdfXu3ZtevXpx1113ldbt0KEDd9xxB3369GHBggWMGTOG/v3706tXL6677rrSrs0PPviA3r1707dvX0aOHFm6kmJxcTEjR46kf//+9O7du8JTh4cOHcp3331Hv379eOWVV8psW7RoEQMHDqR3794MGzaMb7/9lg0bNtCvXz8AFi9ezCGHHMKqVasA6NatG9u3b0/ef2IdZermikvJRCSON998k0MPPZRZs2YxZ84cRowYwaGHHsrkyZN5+eWXWbt2LXfffTcvvfQSb775JgsXLmTatGnAvmuVXHrppUyfPp05c+bw/fffM336dACuueYaxowZU7rWyR7PPfcczZo1Y/r06UyfPp1nn32WL774Im6czzzzDAcccAAzZ85k8ODBZbZdeeWV/PrXv2b27NkcffTRjBkzhlatWrFz5062bt3K/Pnzyc/PZ968eRQWFpKTk5N2XXjpTecGx6r1ZGJmbc1sppktMbOPzeyasHykma02s4XhbVBtxyayR+fOnZk9ezZ33XUX8+bNo1mzZmW2f/DBB5xyyink5ORQv359fvSjHzF37lxg37VK3n77bQYMGEDv3r15++23Wbp0KZs3b2bbtm1069YNgPPOO690/1mzZjFp0iT69u3LgAED+Oabb0pnKq6qLVu2sGXLltJZjS+44ILS+Lp168a7777L3Llzueaaa5g7dy7z5s3ThJBVpZZJXFEMwBcB17n7+2bWFHjPzPaMho519zERxBSZLVu2sDHZYwK1oK6fhXbEEUfwxhtv8MYbb3DffffRs2fPKteNXatkx44d3HTTTbz++uvk5uYyevRoduzYUWF9d+e3v/1tyqZT2bMi46pVqxg4cCCPPPIIZsYZZ5yRkueT/UOtJxN3XwOsCe9vNbNPgMybNjcJCncXct7U8yrfMQ0V7i6kbYO2UYeR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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(\"\\n\\n#### REGULAR HEAT FLOWS COMPARED TO DEMAND (AREA PLOT) ####\\n\\n\")\n",
    "stor_boil_flow_reg = prep_area_plot(tot_flow_reg)\n",
    "ax = stor_boil_flow_reg.plot(kind=\"area\", colormap = \"Set1\")\n",
    "ax.set_xlabel('Time (h)')\n",
    "ax.set_ylabel('Q (kW)')\n",
    "demand.plot(kind = \"line\", drawstyle='steps-pre', ax=ax, linewidth=1.5, color = \"GREEN\")\n",
    "plt.show()\n",
    "tot_flow_reg\n",
    "stor_boil_flow_sched = prep_area_plot(tot_flow_sched)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "#### SCHEDULE HEAT FLOWS COMPARED TO DEMAND (AREA PLOT) ####\n",
      "\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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3kl7YF142jqgA1BgZvWBZsABO9m4+wRgAkDTpn01BBahvDx4++2oo6idU0+NOgJJpvXr19OyZUtGjhxJ8+bNefLJJ2natCk7duygdevW9O/fn5tuuolNmzbRokULnn/+eW688cYD2ilNHK1bt2bnzp28/PLLnH/++TRv3pymTZvy7rvvcsIJJ/DCCy+U1TnrrLMYP348p59+OtnZ2axYsYIjjjiCxo0bVzv+Zs2a0aJFC2bPnk1+fv4+e6/k5+fzk5/8hEGDBpGVlUXLli2ZOnVquZt41aWkJRMzawMUhYmkIXAmwaT6TOB84AVgFPCnsMpr4eO54fG3NF8iIrWxZMkSxo0bR1ZWFtnZ2YwfP565c+cyZMgQDj/8cGbOnMl9993HaaedhrszdOhQhg0bdkA7zZs356qrrqJHjx584xvfoF+/fmXHnnrqKa666iqysrI45ZRTaNasGRDs/75mzRr69OmDu9OmTRteffXVGr+GSZMmcc0117Br1y6OOuoonnnmGQA6duyIu5dtmnXyySdTUFBAixYtavOrSpik7WdiZj0JJtjrEVw1NsXd7zazowgSSUvgX8BIdy80swbA74DewBbgQnf/uLLnaNq0r+/Yof1MolD6yT7deybpGn+qOxj2M9m5cydNmjQB4L777mPDhg388pe/jDiqA9XVfibJvJprMUFi2L/8Y6B/OeW7gQuSFY+ISCK98cYb/OxnP6O4uJgjjzySiRMnRh1SpPQNeBGRWhgxYgQjRoyo1rlLlizhkksu2acsJyeHd999NxmhRULJREQkyXJzc8u+S5KptNCjiIjETclERETipmQiIiJxUzIRkYx355138sADD0QdBh07dmTTpgpXiEprmoAXkaTbkNeHvV98kbD2stq0od2ihQlrT+KnnomIJF0iE0l127v33nvp0qULJ598Mh9++CEAq1atYsiQIRx//PHk5+ezfPlyAC677DKuvfZaTjzxRI466ijefvttrrjiCo477jguu+yysjavvfZa+vbtS/fu3bnjjjvKyjt27Mgdd9xBnz59yM3NLWt38+bNDB48mO7du3PllVeSyYt6KJmISMZZsGABL7zwAosWLWLq1KnMmzcPgNGjR/Poo4+yYMECHnjgAa677rqyOlu3bmXu3Lk8/PDDnHvuufzgBz/ggw8+YMmSJWWX9d57773Mnz+fxYsX8/e//53FixeX1W/dujULFy7k2muvLRtSu+uuuzj55JP54IMPOO+888r2HslEGuYSkYwze/ZszjvvvLL9Pc4991x2797NP/7xj7Kl3AEKCwvL7n/729/GzMjNzeWwww4jNzcXgO7du7NmzRry8vKYMmUKEyZMoLi4mA0bNrB06VJ69gxWL//v//5vAI4//nj++Mc/AjBr1qyy+0OHDo18/axkUjIRkYPC3r17ad68eYVfHszJyQEgKyur7H7p4+LiYlavXs0DDzzAvHnzaNGiBZdddtk+y9GX1qlXrx7FxcUcbDTMJSIZZ9CgQbz66qt8/fXX7Nixgz//+c80atSITp068dJLLwHBviPvv/9+tdvcvn07jRs3plmzZnz++ee8+eab1YrjuXAXuTfffJOtW7fW7gWlAfVMRCTj9OnThxEjRtCrVy/atm1btnT85MmTufbaa7nnnnsoKiriwgsvpFevXtVqs1evXvTu3ZuuXbvSoUMHBg4cWGWdO+64g4suuoju3btz0kkn8c1vfjOu15XKkrYEfV3QEvTRSfcl3NM9/lS3/7LnujQ4Omm/BL2ISCm98Wc+zZmIiEjclExERCRuSiYiIhI3JRMREYmbkomIiMRNyUREDloTJ07khhtuqHX9t99+m3POOafK85o0aVLr50gXujRYRJLud7/7HV9//XXC2mvYsCGXXHJJwtqT+CWtZ2JmHcxsppktNbMPzOx/wvI7zWydmS0Kb2fH1LnNzFaa2YdmdlayYhORupXIRFKd9r766iuGDh1Kr1696NGjBy+++CLz5s3jpJNOolevXvTv358dO3YAsH79eoYMGULnzp25+eaby9qYPn06AwYMoE+fPlxwwQXs3LkTgGnTptG1a1f69OlTtogjHLgBV48ePVizZs0Bsf3iF7+gX79+9OzZc59l7NNdMnsmxcBYd19oZk2BBWb21/DYw+6+z7ZnZtYNuBDoDhwO/M3Murh7SRJjFJEMNG3aNA4//HDeeOMNALZt20bv3r158cUX6devH9u3b6dhw4YALFq0iH/961/k5ORw7LHHcuONN9KwYUPuuece/va3v9G4cWPuv/9+HnroIW6++Wauuuoq3nrrLY455hhGjBhRo7imT5/ORx99xHvvvYe7c+655zJr1iwGDRqU8N9BXUtaMnH3DcCG8P4OM1sGHFFJlWHAC+5eCKw2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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>storage_flow</th>\n",
       "      <th>boiler_flow</th>\n",
       "      <th>schedule</th>\n",
       "      <th>total_heat_flow</th>\n",
       "      <th>demand</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2017-01-01 00:00:00</th>\n",
       "      <td>176.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>300</td>\n",
       "      <td>176.0</td>\n",
       "      <td>176.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 01:00:00</th>\n",
       "      <td>148.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>30</td>\n",
       "      <td>148.0</td>\n",
       "      <td>148.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 02:00:00</th>\n",
       "      <td>26.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>10</td>\n",
       "      <td>26.0</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 03:00:00</th>\n",
       "      <td>198.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>300</td>\n",
       "      <td>198.0</td>\n",
       "      <td>198.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 04:00:00</th>\n",
       "      <td>170.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>120</td>\n",
       "      <td>170.0</td>\n",
       "      <td>170.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 05:00:00</th>\n",
       "      <td>199.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>120</td>\n",
       "      <td>199.2</td>\n",
       "      <td>199.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 06:00:00</th>\n",
       "      <td>0.0</td>\n",
       "      <td>94.0</td>\n",
       "      <td>50</td>\n",
       "      <td>94.0</td>\n",
       "      <td>94.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 07:00:00</th>\n",
       "      <td>0.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>10</td>\n",
       "      <td>66.0</td>\n",
       "      <td>66.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     storage_flow  boiler_flow  schedule  total_heat_flow  \\\n",
       "2017-01-01 00:00:00         176.0          0.0       300            176.0   \n",
       "2017-01-01 01:00:00         148.0          0.0        30            148.0   \n",
       "2017-01-01 02:00:00          26.0          0.0        10             26.0   \n",
       "2017-01-01 03:00:00         198.0          0.0       300            198.0   \n",
       "2017-01-01 04:00:00         170.0          0.0       120            170.0   \n",
       "2017-01-01 05:00:00         199.2          0.0       120            199.2   \n",
       "2017-01-01 06:00:00           0.0         94.0        50             94.0   \n",
       "2017-01-01 07:00:00           0.0         66.0        10             66.0   \n",
       "\n",
       "                     demand  \n",
       "2017-01-01 00:00:00   176.0  \n",
       "2017-01-01 01:00:00   148.0  \n",
       "2017-01-01 02:00:00    26.0  \n",
       "2017-01-01 03:00:00   198.0  \n",
       "2017-01-01 04:00:00   170.0  \n",
       "2017-01-01 05:00:00   199.2  \n",
       "2017-01-01 06:00:00    94.0  \n",
       "2017-01-01 07:00:00    66.0  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(\"\\n\\n#### SCHEDULE HEAT FLOWS COMPARED TO DEMAND (AREA PLOT) ####\\n\\n\")\n",
    "stor_boil_flow_sched = prep_area_plot(tot_flow_sched)\n",
    "ax = stor_boil_flow_sched[stor_boil_flow_sched.columns.difference(['schedule'])].plot(kind=\"area\", colormap = \"Set1\")\n",
    "ax.set_xlabel('Time (h)')\n",
    "ax.set_ylabel('Q (kW)')\n",
    "demand.plot(kind = \"line\", drawstyle='steps-pre', ax=ax, linewidth=1.5, color = \"GREEN\", ylim=(0,350))\n",
    "schedule_df.plot(kind = \"line\", drawstyle='steps-pre', ax=ax, linewidth=1.5, color = \"BLUE\")\n",
    "plt.show()\n",
    "tot_flow_sched"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "#### FLEXIBLE HEAT FLOWS COMPARED TO DEMAND (AREA PLOT) ####\n",
      "\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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1KZkUlx5yWSJmV24b6GZ/RxYmpyQREQk3ZTXzXUt8LqZXcp/ZgzuCdQFRiQzMBGRVKaWSXHlTaeyHuhlZgOBzmHxVHefnvTIREQkbRzQRYvuPsPdnwhvSiQJMnnSZG644YZK13///fc5/fTy52hq0KBBpZ9DREpWUFAQdQgpJanTqaSCqVOnsmtX4q6xrFOnDkOGDEnY8UREqoOkTqeSChKZSA70eDt27OC8885jwIABZGdnM3nyZBYuXMiQIUMYMGAAgwcPZkfeDgC++uorTj31VNq3b8+tt95adIxp06bRp08fevTowdlnn01eXh4Af//73+nYsSM9evQomsQR4O677+aRRx4petylSxfWrFmzX2wPP/wwWVlZdOvWrdg09iIi8aj2LZMozJgxg8MPP7xoXqzc3FwGDhzI+PHj6d69O9u3bye3di4AixcvZuHChdSpU4cOHTrwi1/8grp163Lffffx7rvvUr9+fX7729/y6KOPcuutt3LFFVcwY8YMjjnmGEaOHFmhuKZNm8aKFSv46KOPcHeGDRvGzJkzyc5O3wvIRKKibq7ilEySoFOnTtx9993ce++9DBo0iEaNGtGyZcuiOboaNmzIzvxgOZiTTjqJxo0bF9X74osv+Pbbb1myZEnR/Fu7d++mT58+LFu2jDZt2tC+fXsAfv7znzNu3LgDjmvatGlMmzatKI68vDxWrFihZCIicVMySYJ27drx7rvv8u677/LAAw9w4oknlrpv7HTzhdPHuzunnHIKL730UrF9y5rjqlatWsW+KcVOT1/I3bn99tu58sorK/JyRETKVe3PmURh48aN1K1bl7PPPptrr72WBQsWsGnTJhYuXAgELYKy1hzp3bs3s2fPZuXKlUBwDmb58uV07NiRNWvWFC0DHJtsMjIyWLBgAQALFixg9erV+x138ODBPPPMM0XnX9avX8/mzZv3209EyqfrTIpTyyQJlixZwj333EONGjWoXbs2Dz30EO7OHXfcwXfffUfdunV58uUnS63fokULnn32WUaNGlV0wv++++7jRz/6EePGjWPo0KHUq1ePfv36sX37dgB+9rOf8fzzz9O5c2d69erFj370o/2OO2jQIJYuXUqfPn2AYMjwCy+8wGGHHZaE34JI9aZkUly1TyZ16tRJ+NDg8gwcOJCBAwfuVx67oNWm/E0MHzmcDs07FJW9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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>storage_flow</th>\n",
       "      <th>boiler_flow</th>\n",
       "      <th>schedule</th>\n",
       "      <th>total_heat_flow</th>\n",
       "      <th>demand</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2017-01-01 00:00:00</th>\n",
       "      <td>176.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>176.0</td>\n",
       "      <td>176.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 01:00:00</th>\n",
       "      <td>148.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>20.0</td>\n",
       "      <td>148.0</td>\n",
       "      <td>148.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 02:00:00</th>\n",
       "      <td>26.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>26.0</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 03:00:00</th>\n",
       "      <td>198.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>198.0</td>\n",
       "      <td>198.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 04:00:00</th>\n",
       "      <td>170.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>170.0</td>\n",
       "      <td>170.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 05:00:00</th>\n",
       "      <td>199.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>30.0</td>\n",
       "      <td>199.2</td>\n",
       "      <td>199.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 06:00:00</th>\n",
       "      <td>82.8</td>\n",
       "      <td>11.2</td>\n",
       "      <td>10.0</td>\n",
       "      <td>94.0</td>\n",
       "      <td>94.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 07:00:00</th>\n",
       "      <td>0.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>66.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     storage_flow  boiler_flow  schedule  total_heat_flow  \\\n",
       "2017-01-01 00:00:00         176.0          0.0       NaN            176.0   \n",
       "2017-01-01 01:00:00         148.0          0.0      20.0            148.0   \n",
       "2017-01-01 02:00:00          26.0          0.0       NaN             26.0   \n",
       "2017-01-01 03:00:00         198.0          0.0       NaN            198.0   \n",
       "2017-01-01 04:00:00         170.0          0.0     100.0            170.0   \n",
       "2017-01-01 05:00:00         199.2          0.0      30.0            199.2   \n",
       "2017-01-01 06:00:00          82.8         11.2      10.0             94.0   \n",
       "2017-01-01 07:00:00           0.0         66.0     100.0             66.0   \n",
       "\n",
       "                     demand  \n",
       "2017-01-01 00:00:00   176.0  \n",
       "2017-01-01 01:00:00   148.0  \n",
       "2017-01-01 02:00:00    26.0  \n",
       "2017-01-01 03:00:00   198.0  \n",
       "2017-01-01 04:00:00   170.0  \n",
       "2017-01-01 05:00:00   199.2  \n",
       "2017-01-01 06:00:00    94.0  \n",
       "2017-01-01 07:00:00    66.0  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(\"\\n\\n#### FLEXIBLE HEAT FLOWS COMPARED TO DEMAND (AREA PLOT) ####\\n\\n\")\n",
    "stor_boil_flow_flex = prep_area_plot(tot_flow_flex)\n",
    "ax = stor_boil_flow_flex[stor_boil_flow_flex.columns.difference(['schedule'])].plot(kind=\"area\", colormap = \"Set1\")\n",
    "ax.set_xlabel('Time (h)')\n",
    "ax.set_ylabel('Q (kW)')\n",
    "demand.plot(kind = \"line\", drawstyle='steps-pre', ax=ax, linewidth=1.5, color = \"GREEN\")\n",
    "schedule_flex_df.plot(kind = \"line\", drawstyle='steps-pre', ax=ax, linewidth=1.5, color = \"BLUE\")\n",
    "plt.show()\n",
    "tot_flow_flex"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The excess of the boiler heat production during the last timestep was stored into the storage:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>variable_name</th>\n",
       "      <th>flow</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2017-01-01 00:00:00</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 01:00:00</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 02:00:00</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 03:00:00</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 04:00:00</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 05:00:00</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 06:00:00</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-01-01 07:00:00</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "variable_name        flow\n",
       "2017-01-01 00:00:00   0.0\n",
       "2017-01-01 01:00:00   0.0\n",
       "2017-01-01 02:00:00   0.0\n",
       "2017-01-01 03:00:00   0.0\n",
       "2017-01-01 04:00:00   0.0\n",
       "2017-01-01 05:00:00   0.0\n",
       "2017-01-01 06:00:00   0.0\n",
       "2017-01-01 07:00:00   0.0"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h2stor_flex = results[(b_th_flex, storage_th_flex)][\"sequences\"]\n",
    "h2stor_flex"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
